spin_unlock(&ASIDpool[core].asid_lock);
}
-static inline int svm_inject_exception(struct vcpu *v, int trap, int error_code)
+static inline void svm_inject_exception(struct vmcb_struct *vmcb,
+ int trap, int error_code)
{
- void save_svm_cpu_user_regs(struct vcpu *, struct cpu_user_regs *);
- struct cpu_user_regs regs;
+ eventinj_t event;
- printf("svm_inject_exception(trap %d, error_code 0x%x)\n",
- trap, error_code);
- save_svm_cpu_user_regs(v, ®s);
- __hvm_bug(®s);
+ event.bytes = 0;
+ event.fields.v = 1;
+ event.fields.type = EVENTTYPE_EXCEPTION;
+ event.fields.vector = trap;
+ event.fields.ev = 1;
+ event.fields.errorcode = error_code;
+
+ ASSERT(vmcb->eventinj.v == 0);
+
+ vmcb->eventinj = event;
}
void stop_svm(void)
|| !test_bit(SVM_CPU_STATE_PAE_ENABLED,
&vc->arch.hvm_svm.cpu_state))
{
- svm_inject_exception(vc, TRAP_gp_fault, 0);
+ svm_inject_exception(vmcb, TRAP_gp_fault, 0);
}
}
if (!IS_CANO_ADDRESS(msr_content))
{
HVM_DBG_LOG(DBG_LEVEL_1, "Not cano address of msr write\n");
- svm_inject_exception(vc, TRAP_gp_fault, 0);
+ svm_inject_exception(vmcb, TRAP_gp_fault, 0);
}
if (regs->ecx == MSR_FS_BASE)
{
struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
unsigned long eip, error_code;
- eventinj_t event;
ASSERT(vmcb);
/* Reflect it back into the guest */
- event.bytes = 0;
- event.fields.v = 1;
- event.fields.type = EVENTTYPE_EXCEPTION;
- event.fields.vector = 13;
- event.fields.ev = 1;
- event.fields.errorcode = error_code;
-
- vmcb->eventinj = event;
+ svm_inject_exception(vmcb, TRAP_gp_fault, error_code);
}
/* Reserved bits: [31:14], [12:1] */
&v->arch.hvm_svm.cpu_state))
{
HVM_DBG_LOG(DBG_LEVEL_1, "Enable paging before PAE enable\n");
- svm_inject_exception(v, TRAP_gp_fault, 0);
+ svm_inject_exception(vmcb, TRAP_gp_fault, 0);
}
if (test_bit(SVM_CPU_STATE_LME_ENABLED, &v->arch.hvm_svm.cpu_state))
*/
if ((value & X86_CR0_PE) == 0) {
if (value & X86_CR0_PG) {
- svm_inject_exception(v, TRAP_gp_fault, 0);
- return 0;
- }
+ svm_inject_exception(vmcb, TRAP_gp_fault, 0);
+ return 0;
+ }
set_bit(ARCH_SVM_VMCB_ASSIGN_ASID, &v->arch.hvm_svm.flags);
vmcb->cr3 = pagetable_get_paddr(v->domain->arch.phys_table);
{
v->arch.hvm_svm.injecting_event = 1;
/* Inject #PG using Interruption-Information Fields */
- vmcb->eventinj.bytes = 0;
- vmcb->eventinj.fields.v = 1;
- vmcb->eventinj.fields.ev = 1;
- vmcb->eventinj.fields.errorcode = regs.error_code;
- vmcb->eventinj.fields.type = EVENTTYPE_EXCEPTION;
- vmcb->eventinj.fields.vector = TRAP_page_fault;
+ svm_inject_exception(vmcb, TRAP_page_fault, regs.error_code);
+
v->arch.hvm_svm.cpu_cr2 = va;
vmcb->cr2 = va;
TRACE_3D(TRC_VMX_INT, v->domain->domain_id,